--MainStatusMachine model
--module(..., package.seeall)

Dev = {  
    mode = '槽式',            --设备模式,光伏,槽式,菲尼尔
    Gap = 1,               --跟踪精度,单位°,可以修改,如在大风时可以设置为10度
    DefaultGap = 0.25,       --默认的跟踪精度,一般不能修改

    A = 0,                    -- 设备偏差角
    H = 0, 
    D = 0,
    
    MainStatus = 'INIT',      --主状态机
    Prompt = "设备上电",    -- 主状态机的提示,用于OLED定时显示,建议4个汉字

    Dip_Sensor =0,          --倾角传感器读数=Inclinator.x    
    Dip_Solar =0,           -- 太阳对设备的倾角,每15秒计算一次    
    Err = 0,                --误差= Incline - Target
    Dip_Night = 90,         -- 夜间停留的位置
}


---------------------------------------------
--      状态机   INIT    状态
---------------------------------------------

function SM_INIT()

    Dev.MainStatus  = 'TRACK'    --进入跟踪状态
    --Dev.TraceStatus = 'CW_STOP'
    --log.debug("主状态机","初始化完成,INIT转入TRACK跟踪状态!")
end

---------------------------------------------
--      状态机    TRACK    自动跟踪状态
---------------------------------------------
function SM_TRACK()

    TrackTo( Dev.Dip_Solar, SCA116T.x, Dev.DefaultGap )
    Dev.Prompt = "自动跟踪"                     -- 提示信息
    --TrackCtrl[Device.TraceStatus]()         -- 跟踪控制

    if Solar.H <0 then                      --太阳沉地平线以下了
        Motor.Run=0                             --电机停机
        ttt = math.random(3)                    --30分钟内的随机停机时间
        Dev.MainStatus  = 'AtNight' 
        Dev.MainStatusPrompt = "傍晚停机"
        log.debug("主状态机",Dev.MainStatus, Dev.MainStatusPrompt,"进入夜间状态,太阳高度", Solar.Dip_Meridian)
    end     --进入夜间模式
end


---------------------------------------------
--              AtNight 晚上,到指定位置，等待日出
---------------------------------------------
function SM_AtNight()
    --  Motor.Run=0     --电机停机
    --if( Tick50ms %100 == 0) then mydbg("MainStatus","AtNight, ttt=",ttt ) end  --5秒显示一次

    -- 转到夜间指定位置
    TrackTo( Dev.Dip_Night, SCA116T.x, 2 )   -- 夜间，精度2度,Dev.Dip_Night 夜间设定的角度，通常是90度
    
    if Solar.H > 0 then                     -- 如果太阳升起，转入自动跟踪状态
        Dev.MainStatus  = 'TRACK'         
        Dev.MainStatusPrompt = "太阳升起"
        log.debug("主状态机",Dev.MainStatus, Dev.MainStatusPrompt,"启动自动跟踪")
    end
end


------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
--                      协程： 设备控制主状态机
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
-- 主状态机的调用关系表table： [ 状态：函数名 ]
MainStatusMachine = {
    INIT    =   SM_INIT,        --初始化
    TRACK   =   SM_TRACK,        --跟踪
    AtNight =   SM_AtNight        --晚上,停机
    --{   "MANUAL",   Manual()    }     -- 手动控制
    --HOT_ALARM
    --WIND_ALARM
    --
}


--sys.wait(5000)  --上电延时5秒钟
log.info("主状态机","启动...")
-- 主状态机调用协程  sys.timerLoopStart
--  sys.taskInit( 
sys.timerLoopStart( function()

    --log.info("主状态机","*")

        -- 确认状态正常
    --if Dev.MainStatus  and type(MainStatusMachine[Dev.MainStatus ]) == "function"  then
        MainStatusMachine[Dev.MainStatus]()        -- 启动主状态机
    --end    
    
        --sys.wait(500)
end, 50) 